环境准备 — 创建数据库
在 MySQL 中创建 teaching 数据库并切换到该数据库
首先登录 MySQL,然后创建 teaching 数据库。如果之前已存在同名数据库,先删除再创建。
建表并插入数据
创建课程表(c)、学生表(s)、教师表(t)、选课表(sc)、教师授课表(tc),并插入示例数据
课程表包含 3 个字段:课程号(cno)、课程名(cn)、课时(ct)。
| cno | cn | ct |
|---|---|---|
| c1 | Java程序设计 | 40 |
| c2 | 程序设计基础 | 48 |
| c3 | 线性代数 | 48 |
| c4 | 数据结构 | 64 |
| c5 | 数据库系统 | 56 |
| c6 | 数据挖掘 | 32 |
| c7 | 高等数学 | 60 |
| c8 | 控制理论 | 32 |
学生表包含:学号(sno)、姓名(sn)、性别(sex)、年龄(age)、专业(maj)、学院(dept)。
教师表包含:教师号(tno)、姓名(tn)、性别(sex)、年龄(age)、职称(prof)、专业(maj)、学院(dept)。
选课表包含:学号(sno)、课程号(cno)、成绩(score)。注意部分成绩为 NULL(学生选了课但没考试)。
教师授课表包含:教师号(tno)、课程号(cno)、开课日期(tcdate)。
无条件查询练习
对应知识点:SELECT…FROM(投影查询)、别名 AS、DISTINCT、LIMIT
目标:分别用列出字段名和 * 两种方式查询课程表 c 的全部内容,对比结果。
| cno | cn | ct |
|---|---|---|
| c1 | Java程序设计 | 40 |
| c2 | 程序设计基础 | 48 |
| c3 | 线性代数 | 48 |
| c4 | 数据结构 | 64 |
| c5 | 数据库系统 | 56 |
| c6 | 数据挖掘 | 32 |
| c7 | 高等数学 | 60 |
| c8 | 控制理论 | 32 |
目标:查询课程表,让结果列名显示为"课程号""课程名""课时"。
目标:查询讲授课程的教师号(不重复)。先不加 DISTINCT 看看重复,再加 DISTINCT 对比。
| tno |
|---|
| t1 |
| t2 |
| t3 |
| t4 |
| t5 |
目标:查询前 3 位学生的姓名、学号和专业。注意字段顺序是 sn → sno → maj。
| sn | sno | maj |
|---|---|---|
| 王彤 | s1 | 计算机 |
| 苏乐 | s2 | 信息 |
| 林欣怡 | s3 | 信息 |
条件查询练习
对应知识点:比较大小、AND/OR/NOT、BETWEEN AND、IN、LIKE、IS NULL
| sno | cno | score |
|---|---|---|
| s1 | c1 | 90.50 |
| s4 | c1 | 93.00 |
| s7 | c7 | 100.00 |
| s8 | c3 | 96.00 |
| tno | tn | maj |
|---|---|---|
| t1 | 刘杨 | 计算机 |
| t4 | 赵礼 | 自动化 |
'教授'。| sno | sn | sex | age | maj | dept |
|---|---|---|---|---|---|
| s1 | 王彤 | 女 | 18 | 计算机 | 信息学院 |
| s5 | 魏立 | 男 | 17 | 数学 | 理学院 |
| s6 | 何欣荣 | 女 | 21 | 计算机 | 信息学院 |
| s7 | 赵琳琳 | 女 | 19 | 数学 | 理学院 |
先查年龄在 [30,40] 的教师:
再查年龄不在 [30,40] 的教师(两种等价写法):
目标:课程号 c1 或 c2,且开课日期 ≥ 2021-09-01。先加括号运行,再去掉括号对比差异。
cno <> 'c4' AND cno <> 'c6'。逐个练习以下 4 条语句,观察通配符的不同效果:
%程序% 匹配到 2 个(Java程序设计、程序设计基础),程序% 只匹配 1 个(程序设计基础)。目标:分别查询没有成绩和有成绩的选课记录,理解 NULL 的特殊性。
独立完成 — 不看答案试试
以下题目基于上面的 5 张表,先自己写 SQL 再点击查看参考答案